<?php
    include(dirname(__FILE__)."/../include/apility/apility.php");
    include(dirname(__FILE__)."/../Dao/db.php");

    class Synchronize
    {
        //メンバ
        var $allAccounts;
        //アカントの情報
        var $authenticationContext;
        //例外の情報処理対象
        var $faultStack;
        //レポートデータの日付
        var $reportDate;
        //曜日
        var $dayOfTheWeek;
        //今週の月曜日
        var $weekly;

        function Synchronize()
        {
            //全部のメンバを取得
            $this->allAccounts = $this->getAllAccounts();
            //例外処理対象を取得
            $this->faultStack = &APIlityFault::getFaultStack();
            //アカントの情報設定
            $this->authenticationContext = &APIlityAuthentication::getContext();
            //レポートデータの日付設定
            $this->reportDate = date("Y-m-d",strtotime("-1 day"));
            //週の開始日を計算
            $this->dayOfTheWeek = date("w",strtotime($this->reportDate));
            if($this->dayOfTheWeek == 1)
            {
                $this->weekly = date("Ymd",strtotime("Monday",strtotime($this->reportDate)));
            }
            else
            {
                $this->weekly = date("Ymd",strtotime("last Monday",strtotime($this->reportDate)));
            }
        }

        function getAllAccounts()
        {
            $allAccounts = array();
            $query = "SELECT * FROM account WHERE status=1";
            $result = mysql_query($query);
            while($row=mysql_fetch_array($result))
            {
                array_push($allAccounts,$row);
            }
            return $allAccounts;
        }

        function run()
        {
            echo date("Y-m-d H:i:s")."　同期バッチ開始\r\n\r\n";
            //アカント一つずつに対処する
            foreach($this->allAccounts as $account)
            {
                echo date("Y-m-d H:i:s")."　".$account['account_name']."　同期開始\r\n";
                //GoogleAdwordsのロジック
                if($account['type'] == 1)
                {
                    echo "媒体種類：GoogleAdwords\r\n";
                    //クライアントアカント設定
                    if(!$this->setContext($account['account_name']))
                    {
                        echo date("Y-m-d H:i:s")."　".$account['account_name']."　同期終了\r\n\r\n";
                        continue;
                    }

                    //キャンペーン同期
                    echo date("Y-m-d H:i:s")."　キャンペーン同期開始\r\n";
                    $this->campaignSync($account['memberId']);
                    echo date("Y-m-d H:i:s")."　キャンペーン同期完成\r\n";

                    //広告グループ同期
                    echo date("Y-m-d H:i:s")."　広告グループ同期開始\r\n";
                    $this->adGroupSync($account['memberId']);
                    echo date("Y-m-d H:i:s")."　広告グループ同期完成\r\n";

                    //クリエイティブ同期
                    echo date("Y-m-d H:i:s")."　クリエイティブ同期開始\r\n";
                    $this->creativeSync($account['memberId']);
                    echo date("Y-m-d H:i:s")."　クリエイティブ同期完成\r\n";

                    //キーワード同期
                    echo date("Y-m-d H:i:s")."　キーワード同期開始\r\n";
                    $this->keywordSync($account['memberId']);
                    echo date("Y-m-d H:i:s")."　キーワード同期完成\r\n";
                }
                echo date("Y-m-d H:i:s")."　".$account['account_name']."　同期終了\r\n\r\n";
            }
            echo date("Y-m-d H:i:s")."　同期バッチ終了\r\n";
        }

        function setContext($ClientEmail)
        {
            //マネッジャのアカント設定
            $this->authenticationContext->setClientEmail($ClientEmail);
            if(!getAccountInfo())
            {
                $fault = array_pop($this->faultStack);
                if(isset($fault))
                {
                    $fault->printFault();
                }
                echo date("Y-m-d H:i:s")."　該当クライアントアカントはクライアントセンターに管理しないかもしれません。或いはネット問題です。ご確認ください。\r\n";
                return false;
            }
            return true;
        }

        //GoogleAdwordsのキャンペーン同期ロジック
        function campaignSync($memberId)
        {
            //更新待ちキャンペーンを取得
            $query = "SELECT * FROM campaign WHERE ";
            $query .= "memberId=$memberId AND ";
            $query .= "listingType=1 AND ";
            $query .= "sync=2";
            $result = mysql_query($query);

            while($row=mysql_fetch_array($result))
            {
                //ローカル管理するID
                $camp_Id = $row['camp_Id'];
                //Google発番のID
                $campaignId = $row['campaignId'];
                $campaignName = $row['name'];
                $dailyBudget = $row['dailyBudget'];
                $startDate = substr($row['startDay'],0,10);

                if(isset($row['endDay']))
                {
                    $endDate = substr($row['endDay'],0,10);
                }
                else
                {
                    $endDate = "2037-12-30";
                }
                $countries = split(",",$row['geoTargeting']);
                $geoTargeting = array('countryTargets' => array('countries' => $countries));
                $languageTargeting = split(",",$row['languageTargeting']);
                $networkTargeting = split(",",$row['networkTargeting']);
                if($row['enableBudgetOptimizer'] == 0)
                {
                    $enableBudgetOptimizer = array("enabled"=>false);
                }
                else
                {
                    $enableBudgetOptimizer = array("enabled"=>true);
                }
                if($row['enableSeparateContentBids'] == 0)
                {
                    $enableSeparateContentBids = false;
                }
                else
                {
                    $enableSeparateContentBids = true;
                }
                $status = $row['status'];
                if($status == 0)
                {
                    $status = "Paused";
                }
                else if($status == 1)
                {
                    $status = "Active";
                }

                echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]同期開始\r\n";
                //新規
                if(!isset($campaignId))
                {
                    echo date("Y-m-d H:i:s")."　新規する\r\n";
                    $campaignObj = addCampaign($campaignName,
                                                $status,
                                                $startDate,
                                                $endDate,
                                                $dailyBudget,
                                                'Daily',
                                                $networkTargeting,
                                                $languageTargeting,
                                                $geoTargeting,
                                                $enableSeparateContentBids,
                                                $adScheduling,
                                                $enableBudgetOptimizer
                                                );
                    if(!$campaignObj)
                    {
                        echo date("Y-m-d H:i:s")."　新規失敗しました\r\n";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //エラーメッセージをデータベースに入れる
                        $this->campaignSyncError($camp_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]新規成功しました\r\n";
                        $campaignId = $campaignObj->getId();
                        //ローカルデータベース更新する
                        $this->campaign_afterNew($camp_Id,$campaignId);
                    }
                }
                //Googleに削除
                else if($row['status'] == 9)
                {
                    echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]削除開始\r\n";
                    $campaignObject = createCampaignObject($campaignId);
                    if(!$campaignObject)
                    {
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]削除失敗しました\r\n";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->campaignSyncError($camp_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]同期終了\r\n\r\n";
                        continue;
                    }
                    if(removeCampaign($campaignObject))
                    {
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]削除成功しました\r\n";
                        $this->campaign_afterDelete($camp_Id);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]削除失敗しました\r\n";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->campaignSyncError($camp_Id,$syncError);
                    }
                }
                //Googleへ更新
                else
                {
                    echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]更新開始\r\n";
                    $campaignObject = createCampaignObject($campaignId);
                    if(!$campaignObject)
                    {
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]更新失敗しました\r\n";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->campaignSyncError($camp_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]同期終了\r\n\r\n";
                        continue;
                    }

                    if(!$campaignObject->setEndDate($endDate))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault)."\r\n";
                    }
                    if(!$campaignObject->setBudgetAmount($dailyBudget))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$campaignObject->setIsEnabledOptimizedAdServing($enableBudgetOptimizer['enabled']))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$campaignObject->setIsEnabledSeparateContentBids($enableSeparateContentBids))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$campaignObject->setName($campaignName))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$campaignObject->setNetworkTargeting($networkTargeting))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$campaignObject->setStatus($status))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }

                    if(isset($syncError))
                    {
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]更新失敗\r\n";
                        //同期エラーを入れる
                        $this->campaignSyncError($camp_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]更新成功\r\n";
                        $this->campaign_afterUpdate($camp_Id);
                    }
                }
                echo date("Y-m-d H:i:s")."　キャンペーン[$camp_Id]同期終了\r\n";
            }
        }

        //GoogleAdwordsの広告グループ同期ロジック
        function adGroupSync($memberId)
        {
            $query = "SELECT b.campaignId,a.adGr_Id,a.adGroupId,";
            $query .= "a.name,a.status,a.maxCpc,a.maxCpm,a.maxContentCpc ";
            $query .= "FROM adgroup a JOIN campaign b ";
            $query .= "ON a.camp_Id=b.camp_Id ";
            $query .= "WHERE ";
            $query .= "a.sync=2 AND ";
            $query .= "a.memberId=$memberId AND ";
            $query .= "a.listingType=1 AND ";
            //所属するキャンペーンもう同期済み場合、該当広告グループは同期気できる
            $query .= "b.campaignId IS NOT null AND ";
            $query .= "b.sync=1";
            $result = mysql_query($query);
            while($row=mysql_fetch_array($result))
            {
                $campaignId = $row['campaignId'];
                $adGr_Id = $row['adGr_Id'];
                $adGroupId = $row['adGroupId'];
                $adGroupName = $row['name'];
                $status = $row['status'];
                if($status == 1)
                {
                    $status = "Enabled";
                }
                else if($status == 0)
                {
                    $status = "Paused";
                }
                $keywordMaxCpc = $row['maxCpc'];
                $siteMaxCpm = $row['maxCpm'];
                $keywordContentMaxCpc = $row['maxContentCpc'];

                echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]同期開始\r\n";
                //新規
                if(!isset($adGroupId))
                {
                    echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]新規開始\r\n";
                    $adGroupObject = addAdGroup($adGroupName,
                                                $campaignId,
                                                $status,
                                                $keywordMaxCpc,
                                                $siteMaxCpm,
                                                null,
                                                null,
                                                $keywordContentMaxCpc
                                               );

                    if(!$adGroupObject)
                    {
                        echo date("Y-m-d H:i:s")."　新規失敗しました";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->adGroupSyncError($adGr_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]新規成功しました\r\n";
                        $adGroupId = $adGroupObject->getId();
                        $this->adGroup_afterNew($adGr_Id,$adGroupId);
                    }
                }
                //削除
                else if($status == 9)
                {
                    echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]削除開始\r\n";
                    $adGroupObject = createAdGroupObject($adGroupId);
                    if(!$adGroupObject)
                    {
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]削除失敗しました";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //エラーメッセージをデータベースに入れる
                        $this->adGroupSyncError($adGr_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]同期終了\r\n";
                        continue;
                    }
                    if(removeAdGroup($adGroupObject))
                    {
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]削除成功\r\n";
                        $this->adGroup_afterDelete($adGr_Id);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]削除失敗";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->adGroupSyncError($adGr_Id,$syncError);
                    }
                }
                //更新
                else
                {
                    echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]更新開始\r\n";
                    $adGroupObject = createAdGroupObject($adGroupId);
                    if(!$adGroupObject)
                    {
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]更新失敗しました";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //エラーメッセージをデータベースに入れる
                        $this->adGroupSyncError($adGr_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]同期終了\r\n\r\n";
                        continue;
                    }
                    if(!$adGroupObject->setKeywordContentMaxCpc($keywordContentMaxCpc))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault)."\r\n";
                    }
                    if(!$adGroupObject->setKeywordMaxCpc($keywordMaxCpc))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$adGroupObject->setName($adGroupName))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
//                    if(!$adGroupObject->setSiteMaxCpm($siteMaxCpm))
//                    {
//                        $fault = array_pop($this->faultStack);
//                        $fault->printFault();
//                        $syncError .= $this->getSyncError($fault)."\r\n";
//                    }
                    if(!$adGroupObject->setStatus($status))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }

                    if(isset($syncError))
                    {
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]更新失敗\r\n";
                        $this->adGroupSyncError($adGr_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]更新成功\r\n";
                        $this->adGroup_afterUpdate($adGr_Id);
                    }
                }
                echo date("Y-m-d H:i:s")."　広告グループ[$adGr_Id]同期終了\r\n";
            }
        }

        //GoogleAdwordsのクリエイティブ同期ロジック
        function creativeSync($memberId)
        {
            $query = "SELECT b.adGroupId,a.Crt_Id,a.creativeId,";
            $query .= "a.headline,a.description1,a.description2,";
            $query .= "a.status,a.displayUrl,a.redirectUrl ";
            $query .= "FROM creative a JOIN adgroup b ";
            $query .= "ON a.adGr_Id=b.adGr_Id ";
            $query .= "WHERE ";
            $query .= "a.sync=2 AND ";
            $query .= "a.memberId=$memberId AND ";
            $query .= "a.listingType=1 AND ";
            //所属する広告グループもう同期済み場合、該当クリエイティブは同期気できる
            $query .= "b.adGroupId IS NOT null AND ";
            $query .= "b.sync=1";
            $result = mysql_query($query);
            while($row=mysql_fetch_array($result))
            {
                $adGroupId = $row['adGroupId'];
                $Crt_Id = $row['Crt_Id'];
                $creativeId = $row['creativeId'];
                $headLine = $row['headline'];
                $description1 = $row['description1'];
                $description2 = $row['description2'];
                $displayUrl = $row['displayUrl'];
                //
                $destinationUrl = $row['redirectUrl'];
                $status = $row['status'];
                if($status == 1)
                {
                    $status = "Enabled";
                }
                else if($status == 0)
                {
                    $status = "Paused";
                }

                echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]同期開始\r\n";
                //新規
                if(!isset($creativeId))
                {
                    echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]新規開始\r\n";
                    $creativeObject = addTextAd($adGroupId,
                                               $headLine,
                                               $description1,
                                               $description2,
                                               $status,
                                               $displayUrl,
                                               $destinationUrl);
                    if(!$creativeObject)
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]新規失敗しました";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->creativeSyncError($Crt_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]新規成功\r\n";
                        $creativeId = $creativeObject->getId();
                        $this->creative_afterNew($Crt_Id,$creativeId);
                    }
                }
                //削除
                else if($status == 9)
                {
                    echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]削除開始\r\n";
                    $creativeObject = createAdObject($adGroupId,$creativeId);
                    if(!$creativeObject)
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]削除失敗しました";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //エラーメッセージをデータベースに入れる
                        $this->creativeSyncError($Crt_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]同期終了\r\n";
                        continue;
                    }
                    if(removeAd($creativeObject))
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]削除成功\r\n";
                        $this->creative_afterDelete($Crt_Id);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]削除失敗";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->creativeSyncError($Crt_Id,$syncError);
                    }
                }
                //更新
                else
                {
                    echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]更新開始\r\n";
                    $creativeObject = createAdObject($adGroupId,$creativeId);
                    if(!$creativeObject)
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]更新失敗しました";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //エラーメッセージをデータベースに入れる
                        $this->creativeSyncError($Crt_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]同期終了\r\n\r\n";
                        continue;
                    }
                    if(!$creativeObject->setStatus($status))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault)."\r\n";
                    }
                    if(!$creativeObject->setHeadline($headLine))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$creativeObject->setDescription1($description1))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault)."\r\n";
                    }
                    if(!$creativeObject->setDescription2($description2))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$creativeObject->setDisplayUrl($displayUrl))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$creativeObject->setDestinationUrl($destinationUrl))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }

                    if(isset($syncError))
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]更新失敗\r\n";
                        $this->creativeSyncError($Crt_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]更新成功\r\n";
                        $this->creative_afterUpdate($Crt_Id,$creativeObject->getId());
                    }
                }
                echo date("Y-m-d H:i:s")."　クリエイティブ[$Crt_Id]同期終了\r\n";
            }
        }

        //GoogleAdwordsのキーワード同期ロジック
        function keywordSync($memberId)
        {
            $query = "SELECT b.adGroupId,a.key_Id,a.keywordId,";
            $query .= "a.text,a.type,a.negative,a.maxCpc,";
            $query .= "a.paused,a.status,a.redirectUrl ";
            $query .= "FROM keyword a JOIN adgroup b ";
            $query .= "ON a.adGr_Id=b.adGr_Id ";
            $query .= "WHERE ";
            $query .= "a.sync=2 AND ";
            $query .= "a.memberId=$memberId AND ";
            $query .= "a.listingType=1 AND ";
            //所属する広告グループもう同期済み場合、該当クリエイティブは同期気できる
            $query .= "b.adGroupId IS NOT null AND ";
            $query .= "b.sync=1";

            $result = mysql_query($query);
            while($row=mysql_fetch_array($result))
            {
                $adGroupId = $row['adGroupId'];
                $key_Id = $row['key_Id'];
                $keywordId = $row['keywordId'];
                $headLine = $row['headline'];
                $text = $row['text'];
                $maxCpc = $row['maxCpc'];
                if($row['negative'] == 0)
                {
                    $negative = false;
                }
                else
                {
                    $negative = true;
                }
                if($row['type'] == 2)
                {
                    $type = "Broad";
                }
                else
                {
                    $type = "Exact";
                }
                //
                $destinationUrl = $row['redirectUrl'];
                $paused = $row['paused'];
                $status = $row['status'];

                echo date("Y-m-d H:i:s")."　キーワード[$key_Id]同期開始\r\n";
                //新規
                if(!isset($keywordId))
                {
                    echo date("Y-m-d H:i:s")."　キーワード[$key_Id]新規開始\r\n";
                    $keywordObject = addKeywordCriterion( $text,
                                                          $adGroupId,
                                                          $type,
                                                          $negative,
                                                          $maxCpc,
                                                          //確認待ち
                                                          "ja",
                                                          $destinationUrl
                                                        );

                    if(!$keywordObject)
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]新規失敗しました";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->keywordSyncError($key_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]新規成功\r\n";
                        $keywordId = $keywordObject->getId();
                        $this->keyword_afterNew($key_Id,$keywordId);
                        if($paused == 1)
                        {
                            if(!$keywordObject->setIsPaused($paused))
                            {
                                echo date("Y-m-d H:i:s")."　掲載状態[オフ]設定失敗";
                                $fault = array_pop($this->faultStack);
                                if(isset($fault))
                                {
                                    $fault->printFault();
                                }
                                $syncError = $this->getSyncError($fault);
                                //同期エラーを入れる
                                $this->keywordSyncError($key_Id,$syncError);
                            }

                        }
                    }
                }
                //削除
                else if($status == 9)
                {
                    echo date("Y-m-d H:i:s")."　キーワード[$key_Id]削除開始\r\n";
                    $keywordObject = createCriterionObject($adGroupId,$keywordId);
                    if(!$keywordObject)
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]削除失敗しました";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //エラーメッセージをデータベースに入れる
                        $this->keywordSyncError($key_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]同期終了\r\n";
                        continue;
                    }
                    if(removeCriterion($keywordObject))
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]削除成功\r\n";
                        $this->keyword_afterDelete($key_Id);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]削除失敗";
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //同期エラーを入れる
                        $this->keywordSyncError($key_Id,$syncError);
                    }
                }
                //更新
                else
                {
                    echo date("Y-m-d H:i:s")."　キーワード[$key_Id]更新開始\r\n";
                    $keywordObject = createCriterionObject($adGroupId,$keywordId);
                    if(!$keywordObject)
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]更新失敗しました";
                        //エラーを取得
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault);
                        //エラーメッセージをデータベースに入れる
                        $this->keywordSyncError($key_Id,$syncError);
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]同期終了\r\n";
                        continue;
                    }
                    if(!$keywordObject->setType($type))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError = $this->getSyncError($fault)."\r\n";
                    }
                    if(!$keywordObject->setMaxCpc($maxCpc))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$keywordObject->setDestinationUrl($destinationUrl))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$keywordObject->setIsNegative($negative))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }
                    if(!$keywordObject->setIsPaused($paused))
                    {
                        $fault = array_pop($this->faultStack);
                        if(isset($fault))
                        {
                            $fault->printFault();
                        }
                        $syncError .= $this->getSyncError($fault)."\r\n";
                    }

                    if(isset($syncError))
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]更新失敗\r\n";
                        $this->keywordSyncError($key_Id,$syncError);
                    }
                    else
                    {
                        echo date("Y-m-d H:i:s")."　キーワード[$key_Id]更新成功\r\n";
                        $this->keyword_afterUpdate($key_Id,$keywordObject->getId());
                    }

                }
                echo date("Y-m-d H:i:s")."　キーワード[$key_Id]同期終了\r\n";
            }
        }

        function campaignSyncError($camp_Id,$syncError)
        {
            $query = "UPDATE campaign SET ";
            $query .= "sync=3,";
            $query .= "syncError='$syncError',";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "camp_Id=$camp_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
        }

        function campaign_afterNew($camp_Id,$campaignId)
        {
            $query = "UPDATE campaign SET ";
            $query .= "sync=1,";
            $query .= "campaignId=$campaignId,";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "camp_Id=$camp_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
        }

        function campaign_afterDelete($camp_Id)
        {
            $query = "UPDATE campaign SET ";
//            $query .= "campaignId=null,";
            $query .= "sync=1,";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "camp_Id=$camp_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
//                //該当キャンペーンの子項目全部で削除、同期済みで設定
//                //広告グループ
//                $query = "UPDATE adgroup SET status=9,sync=1,lastUpdate=now() WHERE ";
//                $query .= "camp_Id=$camp_Id";
//                $result = mysql_query($query);
//
//                //クリエイティブ
//                $query = "UPDATE creative SET status=9,sync=1,lastUpdate=now() WHERE ";
//                $query .= "camp_Id=$camp_Id";
//                $result = mysql_query($query);
//
//                //キーワード
//                $query = "UPDATE keyword SET status=9,sync=1,lastUpdate=now() WHERE ";
//                $query .= "camp_Id=$camp_Id";
//                $result = mysql_query($query);

                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }

       }

        function campaign_afterUpdate($camp_Id)
        {
            $query = "UPDATE campaign SET ";
            $query .= "sync=1,";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "camp_Id=$camp_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
        }

       function adGroupSyncError($adGr_Id,$syncError)
       {
            $query = "UPDATE adgroup SET ";
            $query .= "sync=3,";
            $query .= "syncError='$syncError',";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "adGr_Id=$adGr_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function adGroup_afterNew($adGr_Id,$adGroupId)
       {
           $query = "UPDATE adgroup SET ";
           $query .= "sync=1,";
           $query .= "adGroupId=$adGroupId,";
           $query .= "lastUpdate=now() ";
           $query .= "WHERE ";
           $query .= "adGr_Id=$adGr_Id";
           $result = mysql_query($query);
           if(!$result)
           {
               echo $query;
               echo "\r\n";
               echo mysql_errno() . ": " . mysql_error() . "\r\n";
               echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
           }
           else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function adGroup_afterDelete($adGr_Id)
       {
           $query = "UPDATE adgroup SET ";
//           $query .= "adGroupId=null,";
           $query .= "sync=1,";
           $query .= "lastUpdate=now() ";
           $query .= "WHERE ";
           $query .= "adGr_Id=$adGr_Id";
           $result = mysql_query($query);
           if(!$result)
           {
               echo $query;
               echo "\r\n";
               echo mysql_errno() . ": " . mysql_error() . "\r\n";
               echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
           }
           else
           {
//               //該当広告グループの子項目全部で削除、同期済みで設定
//               //クリエイティブ
//               $query = "UPDATE creative SET status=9,sync=1,lastUpdate=now() WHERE ";
//               $query .= "adGr_Id=$adGr_Id";
//               $result = mysql_query($query);
//
//               //キーワード
//               $query = "UPDATE keyword SET status=9,sync=1,lastUpdate=now() WHERE ";
//               $query .= "adGr_Id=$adGr_Id";
//               $result = mysql_query($query);

               echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
           }

       }

       function adGroup_afterUpdate($adGr_Id)
        {
            $query = "UPDATE adgroup SET ";
            $query .= "sync=1,";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "adGr_Id=$adGr_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
        }

       function creativeSyncError($Crt_Id,$syncError)
       {
            $query = "UPDATE creative SET ";
            $query .= "sync=3,";
            $query .= "syncError='$syncError',";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "Crt_Id=$Crt_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function creative_afterNew($Crt_Id,$creativeId)
       {
           $query = "UPDATE creative SET ";
           $query .= "sync=1,";
           $query .= "creativeId=$creativeId,";
           $query .= "lastUpdate=now() ";
           $query .= "WHERE ";
           $query .= "Crt_Id=$Crt_Id";
           $result = mysql_query($query);
           if(!$result)
           {
               echo $query;
               echo "\r\n";
               echo mysql_errno() . ": " . mysql_error() . "\r\n";
               echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
           }
           else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function creative_afterDelete($Crt_Id)
       {
           $query = "UPDATE creative SET ";
//           $query .= "creativeId=null,";
           $query .= "sync=1,";
           $query .= "lastUpdate=now() ";
           $query .= "WHERE ";
           $query .= "Crt_Id=$Crt_Id";
           $result = mysql_query($query);
           if(!$result)
           {
               echo $query;
               echo "\r\n";
               echo mysql_errno() . ": " . mysql_error() . "\r\n";
               echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
           }
           else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function creative_afterUpdate($Crt_Id,$creativeId)
        {
            $query = "UPDATE creative SET ";
            $query .= "creativeId=$creativeId,";
            $query .= "sync=1,";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "Crt_Id=$Crt_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
        }

       function keywordSyncError($key_Id,$syncError)
       {
            $query = "UPDATE keyword SET ";
            $query .= "sync=3,";
            $query .= "syncError='$syncError',";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "key_Id=$key_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function keyword_afterNew($key_Id,$keywordId)
       {
           $query = "UPDATE keyword SET ";
           $query .= "sync=1,";
           $query .= "keywordId=$keywordId,";
           $query .= "lastUpdate=now() ";
           $query .= "WHERE ";
           $query .= "key_Id=$key_Id";
           $result = mysql_query($query);
           if(!$result)
           {
               echo $query;
               echo "\r\n";
               echo mysql_errno() . ": " . mysql_error() . "\r\n";
               echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
           }
           else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function keyword_afterDelete($key_Id)
       {
           $query = "UPDATE keyword SET ";
//           $query .= "keywordId=null,";
           $query .= "sync=1,";
           $query .= "lastUpdate=now() ";
           $query .= "WHERE ";
           $query .= "key_Id=$key_Id";
           $result = mysql_query($query);
           if(!$result)
           {
               echo $query;
               echo "\r\n";
               echo mysql_errno() . ": " . mysql_error() . "\r\n";
               echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
           }
           else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
       }

       function keyword_afterUpdate($key_Id,$keywordId)
        {
            $query = "UPDATE keyword SET ";
            $query .= "keywordId=$keywordId,";
            $query .= "sync=1,";
            $query .= "lastUpdate=now() ";
            $query .= "WHERE ";
            $query .= "key_Id=$key_Id";
            $result = mysql_query($query);
            if(!$result)
            {
                echo $query;
                echo "\r\n";
                echo mysql_errno() . ": " . mysql_error() . "\r\n";
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新失敗しました\r\n";
            }
            else
            {
                echo date("Y-m-d H:i:s")."　ローカルデータベース更新しました\r\n";
            }
        }

       function getSyncError($fault)
       {
           if(isset($fault))
           {
           $errorMessage = $fault->getMessage();
           $errors = $fault->getErrors();
           $syncError = $errorMessage;
           foreach($errors as $error)
           {
               $field = $error['field'];
               $detail = $error['detail'];
               $syncError .= "\r\n".$field.":".$detail;
           }
           $syncError = str_replace("'","''",$syncError);
           }
           else
           {
               $syncError = "ネット問題、或いは対応する対象はGoogleに存在しんません。ご確認ください。";
           }
           return $syncError;
       }

    }

$instance = new Synchronize();
$instance->run();

?>
